const http = require('http');
const fs = require('fs');
const path = require('path');

const hostname = '0.0.0.0'; // 监听所有网络接口
const port = process.env.PORT || 8080; // 允许通过环境变量设置端口

// MIME类型映射
const mimeTypes = {
  '.html': 'text/html',
  '.js': 'text/javascript',
  '.css': 'text/css',
  '.json': 'application/json',
  '.png': 'image/png',
  '.jpg': 'image/jpg',
  '.jpeg': 'image/jpeg',
  '.gif': 'image/gif',
  '.svg': 'image/svg+xml',
  '.wav': 'audio/wav',
  '.mp4': 'video/mp4',
  '.woff': 'application/font-woff',
  '.ttf': 'application/font-ttf',
  '.eot': 'application/vnd.ms-fontobject',
  '.otf': 'application/font-otf',
  '.wasm': 'application/wasm'
};

const server = http.createServer((req, res) => {
  console.log(`请求: ${req.url}`);
  
  let filePath = '.' + req.url;
  
  // 如果请求的是根路径，则返回index.html
  if (filePath === './') {
    filePath = './index.html';
  }
  
  // 获取文件扩展名
  const extname = String(path.extname(filePath)).toLowerCase();
  const contentType = mimeTypes[extname] || 'application/octet-stream';
  
  // 解析文件路径
  const absolutePath = path.resolve(filePath);
  const shopWebDemoPath = path.resolve('.');
  
  // 安全检查：确保请求的文件在项目目录内
  if (!absolutePath.startsWith(shopWebDemoPath)) {
    res.writeHead(403);
    res.end('403 Forbidden');
    return;
  }
  
  // 检查文件是否存在
  fs.access(filePath, fs.constants.F_OK, (err) => {
    if (err) {
      // 文件不存在，返回404
      fs.readFile('./404.html', (err, content404) => {
        res.writeHead(404, { 'Content-Type': 'text/html' });
        res.end(content404 || '404 Not Found', 'utf-8');
      });
      return;
    }

    // 读取并返回文件内容
    fs.readFile(filePath, (error, content) => {
      if (error) {
        // 其他服务器错误
        res.writeHead(500);
        res.end(`Server Error: ${error.code}`);
      } else {
        // 成功读取文件
        res.writeHead(200, { 'Content-Type': contentType });
        res.end(content, 'utf-8');
      }
    });
  });
});

server.listen(port, hostname, () => {
  const networkInterfaces = require('os').networkInterfaces();
  console.log(`服务器运行在 http://${hostname}:${port}/`);
  console.log('可以通过以下地址访问:');
  
  // 显示所有可用的IP地址
  Object.keys(networkInterfaces).forEach(interfaceName => {
    networkInterfaces[interfaceName].forEach(interfaceInfo => {
      if (!interfaceInfo.internal && interfaceInfo.family === 'IPv4') {
        console.log(`  http://${interfaceInfo.address}:${port}/`);
      }
    });
  });
  
  console.log('按 Ctrl+C 停止服务器');
});